package com.hushao.lims.weblims.util;

import com.hushao.lims.weblims.domain.ClassInfo;
import com.hushao.lims.weblims.domain.ClassroomInfo;
import com.hushao.lims.weblims.domain.TimetableInfo;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 930588706
 * @date 18/3/8
 * 课程数据的分析
 */
@Component
public class TimetablesUtil {


    /**
     * 课程数据分析（课程内容实验室分组）
     * @param sortMap
     * @return
     */
    public Map<String, Map<String, String>> getTimetablesByClassroom(Map<String, Map<String, Map<ClassroomInfo, List<TimetableInfo>>>> sortMap){
        //最终集合
        Map<String,Map<String,String>> finalMap=new LinkedHashMap<>();
        //课次
        int j=1;
        for (Map.Entry<String, Map<String, Map<ClassroomInfo, List<TimetableInfo>>>> m1:sortMap.entrySet()){
            while (true){
                //当前课次：星期1-5课程
                Map<String,String> newMap=new LinkedHashMap<String,String>();
                //课次格式为（0j0j）
                String m1Key="0"+String.valueOf(j*100+j+1);
                //当前课次有没有课程
                if(m1.getKey().equals(m1Key)){
                    //获取当前课次 1-5星期的课程（内容以实验室分组）
                    newMap=getCourseBy1To5WeeksForClassroom(m1.getValue(),0);
                    finalMap.put(m1Key,newMap);
                    break;
                }else {
                    finalMap.put(m1Key,inItNewMap(newMap,1));
                }
                j=j+2;
            }
            j=j+2;
        }
        //判断当前是否是4大节课记录，没有就自动生成值为空的数据
        finalMap=inItFinalMap(finalMap,j);
        return finalMap;
    }

    /**
     *课程数据分析（课程内容班级分组）
     * @param sortMap
     * @return
     */
    public Map<String,Map<String,String>> getTimetablesByClass(Map<String, Map<String, Map<ClassInfo, List<TimetableInfo>>>> sortMap) {
        //最终集合
        Map<String,Map<String,String>> finalMap=new LinkedHashMap<>();
        //课次
        int j=1;
        for (Map.Entry<String, Map<String, Map<ClassInfo, List<TimetableInfo>>>> m1:sortMap.entrySet()){
            while (true){
                //当前课次：星期1-5课程
                Map<String,String> newMap=new LinkedHashMap<String,String>();
                //课次格式为（0j0j）
                String m1Key="0"+String.valueOf(j*100+j+1);
                //当前课次有没有课程
                if(m1.getKey().equals(m1Key)){
                    //获取当前课次内容 1-5星期的课程（以班级分组）
                    newMap=getCourseBy1To5WeeksForClass(m1.getValue(),0);
                    finalMap.put(m1Key,newMap);
                    break;
                }else {
                    finalMap.put(m1Key,inItNewMap(newMap,1));
                }
                j=j+2;
            }
            j=j+2;
        }
        //判断当前是否是4大节课记录，没有就自动生成值为空的数据
        finalMap=inItFinalMap(finalMap,j);
        return finalMap;
    }

    /**
     * 获取当前课次内容 1-5星期的课程
     * @param value
     * @param i 默认值等于1 从星期一开始
     * @return
     */
    private Map<String,String> getCourseBy1To5WeeksForClass(Map<String, Map<ClassInfo, List<TimetableInfo>>> value, int i) {
        Map<String,String> newMap=new LinkedHashMap<String,String>(5);
        for (Map.Entry<String, Map<ClassInfo, List<TimetableInfo>>> m2:value.entrySet()){
            while (true){
                String content="";
                ++i;
                //如果数据大于5，直接返回
                if(i>5){
                    return newMap;
                }
                String m2key="0"+String.valueOf(i);
                if(m2.getKey().equals(m2key)){
                    //当前课次,当前星期：有课
                    for(Map.Entry<ClassInfo, List<TimetableInfo>> m3:m2.getValue().entrySet()){
                        String currContent="第{"+continuous(m3.getValue())+"}周:"+m3.getValue().get(0).getClassInfo().getClassName()+"</br>";
                        content+=currContent;
                        newMap.put(m2key,content);
                    }
                    break;
                }
                newMap.put(m2key,content);
            }
        }
        //判断是否有5条数据 没有就自动生成值为空的数据
        newMap=inItNewMap(newMap,++i);
        return newMap;
    }

    private Map<String, String> getCourseBy1To5WeeksForClassroom(Map<String, Map<ClassroomInfo, List<TimetableInfo>>> value, int i) {
        Map<String,String> newMap=new LinkedHashMap<>(5);
        for (Map.Entry<String, Map<ClassroomInfo, List<TimetableInfo>>> m2:value.entrySet()){
            while (true){
                String content="";
                ++i;
                //如果数据大于5，直接返回
                if(i>5){
                    return newMap;
                }
                String m2key="0"+String.valueOf(i);
                if(m2.getKey().equals(m2key)){
                    //当前课次,当前星期：有课
                    for(Map.Entry<ClassroomInfo, List<TimetableInfo>> m3:m2.getValue().entrySet()){
                        String currContent="第{"+continuous(m3.getValue())+"}周:"+m3.getValue().get(0).getClassroomInfo().getClassroomName()+"教室</br>";
                        content+=currContent;
                        newMap.put(m2key,content);
                    }
                    break;
                }
                newMap.put(m2key,content);
            }
        }
        //判断是否有5条数据 没有就自动生成值为空的数据
        newMap=inItNewMap(newMap,++i);
        return newMap;
    }

    /**
     * 初始化当前课次的每个星期课程
     * @param finalMap
     * @param j
     * @return
     */

    private Map<String,Map<String,String>> inItFinalMap(Map<String, Map<String, String>> finalMap, int j) {
        Map<String,String> newMap=new LinkedHashMap<>(5);
        for (int i=j;i<=7;i+=2){
            finalMap.put("0"+String.valueOf(i*100+i+1),inItNewMap(newMap,1));
        }
        return finalMap;
    }

    /**
     * 初始化当前课次课程
     * @param newMap
     * @param i 次数
     * @return
     */
    private Map<String,String> inItNewMap(Map<String, String> newMap,int i) {
        for (int j=i;j<=5;j++){
            newMap.put("0"+String.valueOf(j),"");
        }
        return newMap;
    }

    /**
     * 每节课的周次连续性
     * @param a
     * @return
     */
    private String continuous(List<TimetableInfo> a){
        String content="";
        if(a.size()>1){
            if(getCycle(a.get(0))+1 != getCycle(a.get(1))){
                content+=getCycle(a.get(0))+",";}
            else {content+=getCycle(a.get(0))+"-";}

            for(int i = 1 ; i < a.size()-1 ; i++){
                if((getCycle(a.get(i))-1 != getCycle(a.get(i-1)))&(getCycle(a.get(i))+1 != getCycle(a.get(i+1)))){
                    content+=getCycle(a.get(i))+",";}
                else if((getCycle(a.get(i))-1 ==getCycle(a.get(i-1)))&(getCycle(a.get(i))+1 != getCycle(a.get(i+1)))){
                    content+=getCycle(a.get(i))+",";}
                else if(!((getCycle(a.get(i))-1 ==getCycle(a.get(i-1)))&(getCycle(a.get(i))+1 == getCycle(a.get(i+1))))){
                    content+=getCycle(a.get(i))+"-";
                }
            }
            content+=getCycle(a.get(a.size()-1));
        }else {
            content+=getCycle(a.get(0));
        }
        return content;

    }
    private int getCycle(TimetableInfo timetableInfo){
        return Integer.parseInt(timetableInfo.getClassTimes().substring(0,2));
    }

}
